package com.baseballgame.client;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.TextField;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.TextEvent;
import java.awt.event.TextListener;
import java.net.Socket;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import com.baseballgame.util.JTextFiledLimit;


public class CreaterPane extends JPanel implements GameFrameSize, ActionListener {
	private JPanel 	top_connectPanel, canvasPanel, bottom_inputPanel; //각 영역을 나타내는 패널
	private int maxNum = 3;					//3, 4 게임룰 숫자(디폴트 3)
	private ClientNetUnit unit;
	private boolean connect_confirm;		//서버와 연결되었는지 확인 여부
	
	/****************** topConnectPanel 구성 컴포넌트 *******************/
	
	private JLabel top_numRuleConf_label;		//숫자 룰 설정 텍스트
	private JLabel top_maxConnConf_label;		//최대 연결 설정 텍스트
	private JComboBox<String> top_maxConnBox;	//최대 연결 수
	private JComboBox<String> top_ruleConfBox;	//게임 숫자 룰 설정
	private JLabel top_ServerIp_label;			//서버 ip 텍스트
	private JLabel top_ServerPort_label;		//서버 port 텍스트
	private JLabel top_Id_label;				//ID 텍스트
	private JTextField top_ServerIpTf;			//서버 ip 입력 필드
	private JTextField top_ServerPortTf;		//서버 port 입력 필드
	private JTextField top_ServerIdTf;			//아이디 입력 필드
	private JButton top_connect_button;			//서버 접속 버튼
	
	/***************** canvasPanel 구성 컴포넌트 **********************/
	
	private Image canvasPanelImg;			//캔버스 패널에 보여질 이미지 객체
	
	/***************** bottomInputPanel 구성 컴포넌트 ******************/
	
	private JLabel bottom_numInput_label;	//사용자 숫자입력 텍스트
	//private JButton bottom_submit_button;	//사용자 입력을 전송할 버튼
	private JTextField bottom_numInputTf;	//사용자의 숫자 입력을 받을 필드
	
	/*************** messageOutPutPanel 구성 컴포넌트 *****************/
	
	private JScrollPane messageOutPut;		//스크롤 패널
	private JTextArea	messageList;		//받는 메세지
	
	
	//생성자 메서드에서 초기화 메서드 호출
	public CreaterPane(){
		init();
	}
	
	private void init(){
		
		connect_confirm = false;	//서버 연결 초기화, 디폴트 false
		
		/************************* 최상위 패널 크기 정의 *****************************/
		
		setSize(new Dimension(frameWidth, frameHeight));
		setLayout(null);
		
		/************************** 각 상위 패널 구성 정의 ***************************/
		
		top_connectPanel  = new JPanel();	//접속이 표현될 패널
		canvasPanel 	  = new JPanel();	//이미지가 표현될 패널
		bottom_inputPanel = new JPanel();	//사용자 입력을 받을 textField, 입력 button 패널
		messageList 	  = new JTextArea();					//메시지 받는 영역
		messageOutPut 	  = new JScrollPane(messageList);		//스크롤 패널
		
		int leftPanelWidth = (getWidth() / 2) +  (getWidth() / 4);
		
		top_connectPanel.setSize(leftPanelWidth, 70);			//top패널 크기 조절
		canvasPanel.setSize(leftPanelWidth, 430);				//canvas패널 크기 조절
		bottom_inputPanel.setSize(leftPanelWidth, 100);			//bottom패널 크기 조절
		messageOutPut.setSize(frameWidth - leftPanelWidth, 545);		//bottom패널 크기 조절
		
		
		/*********************** top_connectPanel 구성 정의 ********************/
		
		top_connectPanel.setBackground(Color.WHITE);
		top_connectPanel.setLocation(0,0);
		top_connectPanel.setLayout(new FlowLayout(0, 40, 5));
		
		/********************* top_connectPanel 컴포넌트 배치 ******************/
		
		top_maxConnConf_label = new JLabel("최대연결 수");
		top_numRuleConf_label = new JLabel("게임 룰");
		top_Id_label		  = new JLabel("아이디");
		
		top_ServerIp_label	  = new JLabel("서버 IP");
		top_ServerPort_label  = new JLabel("서버 Port");
		
		top_ServerIpTf		= new JTextField("127.0.0.1");	//서버 Ip 입력 텍스트 필드
		top_ServerPortTf	= new JTextField("9999");		//서버 Port 입력 텍스트 필드
		top_ServerIdTf		= new JTextField("player");		//아이디 입력 텍스트 필드
		
		top_connect_button  =  new JButton("서버 연결");		//서버 접속 버튼
		top_connect_button.addActionListener(this);
		
		String[] maxConn_str = { "3", "4" };
		String[] ruleConf_str = { "1", "2", "3", "4" };
		top_maxConnBox = new JComboBox<String>(maxConn_str);
		top_ruleConfBox = new JComboBox<String>(ruleConf_str);
		
		top_ServerIpTf.setPreferredSize(new Dimension(100, 20));
		top_ServerPortTf.setPreferredSize(new Dimension(100, 20));
		top_ServerIdTf.setPreferredSize(new Dimension(100, 20));
		
		top_connectPanel.add(top_maxConnConf_label);
		top_connectPanel.add(top_ruleConfBox);
		top_connectPanel.add(top_numRuleConf_label);
		top_connectPanel.add(top_maxConnBox);
		
		top_connectPanel.add(top_Id_label);
		top_connectPanel.add(top_ServerIdTf);
		
		top_connectPanel.add(top_ServerIp_label);
		top_connectPanel.add(top_ServerIpTf);
		
		top_connectPanel.add(top_ServerPort_label);
		top_connectPanel.add(top_ServerPortTf);
		
		top_connectPanel.add(top_connect_button);
		
		
		/********************** canvasPanel 구성 및 컴포넌트 배치 ****************/
		
		//이미지 객체에 이미지 삽입
		canvasPanelImg = Toolkit.getDefaultToolkit().getImage(getClass().getResource("/baseball.png"));
		//이미지 보정
		canvasPanelImg = canvasPanelImg.getScaledInstance(canvasPanel.getWidth(), canvasPanel.getHeight(), Image.SCALE_SMOOTH);
		
		canvasPanel.setLocation(0, top_connectPanel.getHeight());
		
		//캔버스 익명 클래스 선언
		Canvas cvs = new Canvas() {
			 
			@Override
			public void paint(Graphics g)//패널의 paint()함수에서 그려줌
			{
				g.drawImage(canvasPanelImg, 0, 0, this);
			}
		};
		
		cvs.setPreferredSize(new Dimension(leftPanelWidth, canvasPanel.getHeight()));	//캔버스 크기 정의
		//캔버스 패널에 캔버스를 포함시킨다.
		canvasPanel.add(cvs);
		//cvs.repaint();
		
		
		/**************** bottom_inputPanel 컴포넌트 배치 ******************/
		
		bottom_inputPanel.setBackground(Color.WHITE);
		bottom_inputPanel.setLocation(0, top_connectPanel.getHeight() + canvasPanel.getHeight());
		bottom_inputPanel.setLayout(new FlowLayout(0, 20, 10));
		
		bottom_numInput_label	 = new JLabel("숫자를 입력해주세요 : ");
		bottom_numInputTf		 = new JTextField(5);
		
		//서버와 연결된 경우만 엔터키 작동
		/*if(connect_confirm){
			bottom_numInputTf.addKeyListener(new KeyAdapter() {
				@Override
				public void keyReleased(KeyEvent e) {
					if(e.getKeyCode() == KeyEvent.VK_ENTER){
						sendMessage();
					}
				}
			});
		}*/
		
		//텍스트 필드 익명 클래스 선언
		bottom_numInputTf.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				if(connect_confirm){
					if(e.getKeyCode() == KeyEvent.VK_ENTER){
						// JTextField 길이를 체크하는 코드
						if(bottom_numInputTf.getText().length() > maxNum || bottom_numInputTf.getText().length() < maxNum){
							JOptionPane.showMessageDialog(top_connectPanel, "입력값에 오류가 있습니다.");
							//bottom_numInputTf.setText(bottom_numInputTf.getText().substring(0, maxNum));
						}else{
							sendMessage();
						}
					}
				}
			}
		});
		
		bottom_inputPanel.add(bottom_numInput_label);
		bottom_inputPanel.add(bottom_numInputTf);
		
		/**************** messageOutPutPanel 컴포넌트 배치 ******************/
		
		messageOutPut.setLocation(leftPanelWidth, 0);
		messageList.setEditable(false);
		
		
		/****************** 최상위 패널에 각 하위 패널 배치 *****************/
		
		add(top_connectPanel);
		add(canvasPanel);
		add(bottom_inputPanel);
		add(messageOutPut);
		
	}

	//이벤트 처리
	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource() instanceof JButton){
			JButton button = (JButton)e.getSource();
			
			if(top_ServerIpTf.getText().length() > 0 && top_ServerPortTf.getText().length() > 0){
				if(button.getText() == "서버 연결"){
					try{
						//소켓 만들어서 연결하는 코드
						Socket socket = new Socket(top_ServerIpTf.getText(), Integer.parseInt(top_ServerPortTf.getText()));
						unit = new ClientNetUnit(this, socket);
						unit.start();//메시지 수신 작업 시작
						
						connect_confirm = true;	//엔터키에 의한 메시지 전송 가능
						JOptionPane.showMessageDialog(top_connectPanel, "서버에 연결되었습니다.");
						connectRuleSetting(top_maxConnBox.getSelectedItem().toString(), top_ruleConfBox.getSelectedItem().toString(), top_ServerIdTf.getText());
						//toggleControlState(true);
						//logMessage("***** 서버에 연결 되었습니다. *****");
					}catch(Exception ex){
						JOptionPane.showMessageDialog(top_connectPanel, "서버 연결에 실패하였습니다.");
						ex.printStackTrace();
					}
				}
			}else{
				JOptionPane.showMessageDialog(top_connectPanel, "서버 연결정보를 확인해주세요!");
			}
		}
	}
	
	private void connectRuleSetting(String maxConnStr, String ruleConfStr, String Id){
		//서버로 방장이 설정한 룰전송
		unit.doSend(maxConnStr, ruleConfStr, Id);
	}
	
	public void processMessage(String message2) {
		logMessage(message2);
	}
	
	private void logMessage(String message) {
		messageList.append(message);
		messageList.append("\n");
		messageOutPut.getVerticalScrollBar().setValue(messageOutPut.getVerticalScrollBar().getMaximum());	//스크롤바 자동적으로 아래로 내리기
	}
	
	private void sendMessage(){
		//서버로 메시지 송신		unit.doSend(bottom_numInputTf.getText());
		bottom_numInputTf.setText("");
	}
}